//
//  ViewController.m
//  UICollectionViewTest
//
//  Created by 杨康 on 2018/8/5.
//  Copyright © 2018年 杨康. All rights reserved.
//

#import "ViewController.h"
//瀑布流
//#import "MyLayout.h"
//MyLayout * layout = [[MyLayout alloc]init];
//layout.itemCount = 100;
//layout.columns = 2;



//UICollectionViewDelegateFlowLayout是UICollectionViewDelegate的子协议
@interface ViewController ()<UICollectionViewDelegate,UICollectionViewDataSource>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    
    
    
    //创建一个layout布局类
    //这里是静态设置 UICollectionViewDelegateFlowLayout方法里面是动态设置
    UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc]init];
    //设置行与行之间的间距最小距离
    layout.minimumLineSpacing = 0;
    //设置列与列之间的间距最小距离
    layout.minimumInteritemSpacing = 0;
    //设置头视图尺寸大小
    layout.headerReferenceSize = CGSizeZero;
    //设置尾视图尺寸大小
    layout.footerReferenceSize = CGSizeZero;
    
    //设置分区的EdgeInset
    layout.sectionInset = UIEdgeInsetsMake(20, 20, 20, 20);
    
    
//    下面这两个方法设置分区的头视图和尾视图是否始终固定在屏幕上边和下边
//
//    @property (nonatomic) BOOL sectionHeadersPinToVisibleBounds NS_AVAILABLE_IOS(9_0);
//
//    @property (nonatomic) BOOL sectionFootersPinToVisibleBounds NS_AVAILABLE_IOS(9_0);
    
    
    
    
    //设置布局方向为垂直流布局
    layout.scrollDirection = UICollectionViewScrollDirectionVertical;
    //这个是水平布局
    //layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
    //设置每个item的大小为100*100
    layout.itemSize = CGSizeMake(150, 150);
    //创建collectionView 通过一个布局策略layout来创建
    UICollectionView *collect = [[UICollectionView alloc]initWithFrame:self.view.frame collectionViewLayout:layout];
    //代理设置
    collect.delegate = self;
    collect.dataSource = self;
    //注册item类型 这里使用系统的类型
    [collect registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:@"cellid"];
    
    //这里注册的是头视图或者尾视图的类
    //其中第二个参数是设置 头视图或者尾视图 系统为我们定义好了这两个字符串
    //UIKIT_EXTERN NSString *const UICollectionElementKindSectionHeader NS_AVAILABLE_IOS(6_0);
    //UIKIT_EXTERN NSString *const UICollectionElementKindSectionFooter NS_AVAILABLE_IOS(6_0);
//    [collect registerClass:[UICollectionReusableView class] forSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"headerid"];
    
    
    //从复用池中取出cell或者头尾视图
//    UICollectionReusableView *view = [collect dequeueReusableSupplementaryViewOfKind:UICollectionElementKindSectionHeader withReuseIdentifier:@"headerid" forIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
    
    
    [self.view addSubview:collect];
    
    
    
    
    
//    //获取和设置collection的layout
//    UICollectionViewLayout *mylayout =collect.collectionViewLayout;
//
//
//    //设置是否允许选中 默认yes
//    collect.allowsSelection = YES;
//
//
//    //设置是否允许多选 默认no
//    collect.allowsMultipleSelection = YES;
//
//    //获取所有选中的item的位置信息
//    NSArray<NSIndexPath *> * selectArr= collect.indexPathsForSelectedItems;
//
//    //设置选中某一item，并使视图滑动到相应位置，scrollPosition是滑动位置的相关参数，如下：
//    /*
//     typedef NS_OPTIONS(NSUInteger, UICollectionViewScrollPosition) {
//         //无
//         UICollectionViewScrollPositionNone                 = 0,
//         //垂直布局时使用的 对应上中下
//         UICollectionViewScrollPositionTop                  = 1 << 0,
//         UICollectionViewScrollPositionCenteredVertically   = 1 << 1,
//         UICollectionViewScrollPositionBottom               = 1 << 2,
//         //水平布局时使用的  对应左中右
//         UICollectionViewScrollPositionLeft                 = 1 << 3,
//         UICollectionViewScrollPositionCenteredHorizontally = 1 << 4,
//         UICollectionViewScrollPositionRight                = 1 << 5
//     };
//     */
//
//    [collect selectItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:UICollectionViewScrollPositionNone];
//
//
//    //将某一item取消选中
//    [collect deselectItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO];
//
//
//
//    //使视图滑动到某一位置，可以带动画效果
//    [collect scrollToItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] atScrollPosition:UICollectionViewScrollPositionNone animated:NO];
//
//
//
//    //重新加载数据
//    [collect reloadData];
//
//
//
//
//    //下面这两个方法，可以重新设置collection的布局，后面的方法多了一个布局完成后的回调，iOS7后可以用
//    //使用这两个方法可以产生非常炫酷的动画效果
//    [collect setCollectionViewLayout:mylayout animated:NO completion:^(BOOL finished) {
//
//    }];
//    //下面这些方法更加强大，我们可以对布局更改后的动画进行设置
//    //这个方法传入一个布局策略layout，系统会开始进行布局渲染，返回一个UICollectionViewTransitionLayout对象
//    //这个UICollectionViewTransitionLayout对象管理动画的相关属性，我们可以进行设置
//    UICollectionViewTransitionLayout *transitionLayout = [collect startInteractiveTransitionToCollectionViewLayout:mylayout completion:^(BOOL completed, BOOL finished) {
//
//    }];
//    //准备好动画设置后，我们需要调用下面的方法进行布局动画的展示，之后会调用上面方法的block回调
//    [collect finishInteractiveTransition];
//    //调用这个方法取消上面的布局动画设置，之后也会进行上面方法的block回调
//    [collect cancelInteractiveTransition];
//
//
//    /*下面两个方法获取item或者头尾视图的layout属性，这个UICollectionViewLayoutAttributes对象
//    存放着布局的相关数据，可以用来做完全自定义布局*/
//    UICollectionViewLayoutAttributes *layoutAttributes = [collect layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
////    UICollectionViewLayoutAttributes *suppleLayoutAttributes = [collect layoutAttributesForSupplementaryElementOfKind:UICollectionElementKindSectionHeader atIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
//
//
//    //获取某一点所在的indexpath位置
////    NSIndexPath *indexPath = [collect indexPathForItemAtPoint:CGPointZero];
//
//
//    //根据indexPath获取cell
////    UICollectionViewCell *cell = [collect cellForItemAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
//
//    //获取某个cell所在的indexPath
////    NSIndexPath *indexPath = [collect indexPathForCell:cell];
//
//
//
//
//
//    //获取所有可见cell的数组
//    NSArray<__kindof UICollectionViewCell *> *visibleCells = collect.visibleCells;
//
//
//    //获取所有可见cell的位置数组
//    NSArray<NSIndexPath *> *indexPathsForVisibleItems = collect.indexPathsForVisibleItems;
    
    
    
    //下面三个方法是iOS9中新添加的方法，用于获取头尾视图
    //-(UICollectionReusableView*)supplementaryViewForElementKind:(NSString*)elementKind atIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(9_0)
    //- (NSArray<UICollectionReusableView *> *)visibleSupplementaryViewsOfKind:(NSString *)elementKind NS_AVAILABLE_IOS(9_0);
    //- (NSArray<NSIndexPath *> *)indexPathsForVisibleSupplementaryElementsOfKind:(NSString *)elementKind NS_AVAILABLE_IOS(9_0);
    
    
    
    
    //下面这些方法用于动态添加，删除，移动某些分区获取items
    //-(void)insertSections:(NSIndexSet*)sections
    //{
    //
    //}
    //-(void)deleteSections:(NSIndexSet*)sections
    //{
    //
    //}
    //-(void)reloadSections:(NSIndexSet*)sections
    //{
    //
    //}
    //-(void)moveSection:(NSInteger)section toSection:(NSInteger)newSection
    //{
    //
    //}
    //
    //-(void)insertItemsAtIndexPaths:(NSArray<NSIndexPath*>*)indexPaths
    //{
    //
    //}
    //-(void)deleteItemsAtIndexPaths:(NSArray<NSIndexPath*>*)indexPaths
    //{
    //
    //}
    //-(void)reloadItemsAtIndexPaths:(NSArray<NSIndexPath*>*)indexPaths
    //{
    //
    //}
    //-(void)moveItemAtIndexPath:(NSIndexPath*)indexPath toIndexPath:(NSIndexPath*)newIndexPath
    //{
    //
    //}
    
}
#pragma mark UICollectionViewDataSource
//-----------------------------------------
//返回分区个数
-(NSInteger )numberOfSectionsInCollectionView:(UICollectionView *)collectionView
{
    return 1;
}
//返回每个分区的item个数
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
{
    return 100;
}
//返回每个item
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
    UICollectionViewCell * cell  = [collectionView dequeueReusableCellWithReuseIdentifier:@"cellid" forIndexPath:indexPath];



    cell.backgroundColor = [UIColor colorWithRed:arc4random()%255/255.0 green:arc4random()%255/255.0 blue:arc4random()%255/255.0 alpha:1];
    return cell;
}
//---------------------------------


//对头视图或者尾视图进行设置
//- (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
//{
//
//}
//设置某个item是否可以被移动，返回NO则不能移动
//- (BOOL)collectionView:(UICollectionView *)collectionView canMoveItemAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(9_0)
//{
//
//}
//移动item的时候，会调用这个方法
//- (void)collectionView:(UICollectionView *)collectionView moveItemAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath*)destinationIndexPath
//{
//
//}


#pragma mark UICollectionViewDelegate

//是否允许某个Item的高亮，返回NO，则不能进入高亮状态
//- (BOOL)collectionView:(UICollectionView *)collectionView shouldHighlightItemAtIndexPath:(NSIndexPath *)indexPath
//{
//
//}
//当item高亮时触发的方法
//- (void)collectionView:(UICollectionView *)collectionView didHighlightItemAtIndexPath:(NSIndexPath *)indexPath
//{
//
//}
//结束高亮状态时触发的方法
//- (void)collectionView:(UICollectionView *)collectionView didUnhighlightItemAtIndexPath:(NSIndexPath *)indexPath
//{
//
//}

//是否可以选中某个Item，返回NO，则不能选中
//- (BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath
//{
//
//}

//是否可以取消选中某个Item

//- (BOOL)collectionView:(UICollectionView *)collectionView shouldDeselectItemAtIndexPath:(NSIndexPath *)indexPath
//{
//
//}



//已经选中某个item时触发的方法

//- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath
//{
//
//}



//取消选中某个Item时触发的方法

//- (void)collectionView:(UICollectionView *)collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath
//{
//
//}



//将要加载某个Item时调用的方法

//- (void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(8_0)
//{
//
//}



//将要加载头尾视图时调用的方法

//- (void)collectionView:(UICollectionView *)collectionView willDisplaySupplementaryView:(UICollectionReusableView *)view forElementKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath NS_AVAILABLE_IOS(8_0)
//{
//
//}



//已经展示某个Item时触发的方法

//- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath
//{
//
//}



//已经展示某个头尾视图时触发的方法

//- (void)collectionView:(UICollectionView *)collectionView didEndDisplayingSupplementaryView:(UICollectionReusableView *)view forElementOfKind:(NSString *)elementKind atIndexPath:(NSIndexPath *)indexPath
//{
//
//}



//这个方法设置是否展示长按菜单

//- (BOOL)collectionView:(UICollectionView *)collectionView shouldShowMenuForItemAtIndexPath:(NSIndexPath *)indexPath
//{
//    return YES;
//}

//这个方法用于设置要展示的菜单选项

//- (BOOL)collectionView:(UICollectionView *)collectionView canPerformAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(nullable id)sender
//{
//    //每个item有三个按钮
//    //1.indexPath 2.按钮方法名 3.按钮
//    if (indexPath.section==0) {
//        if (indexPath.row == 0) {
//            NSString *str =NSStringFromSelector(action);
//            if ([str isEqualToString:@"cut:"]) {
////                UIMenuController
//
//            }else
//            {
//                return NO;
//            }
//        }
//    }
//    return YES;
//}


//这个方法用于实现点击菜单按钮后的触发方法,通过测试，只有copy，cut和paste三个方法可以使用
//- (void)collectionView:(UICollectionView *)collectionView performAction:(SEL)action forItemAtIndexPath:(NSIndexPath *)indexPath withSender:(nullable id)sender
//{
//    NSString *str =NSStringFromSelector(action);
//    if ([str isEqualToString:@"cut:"]) {
//        NSLog(@"woooo");
//    }
//    else if([str isEqualToString:@"copy:"])
//    {
//        NSLog(@"44455");
//    }
//    else if([str isEqualToString:@"paste:"])
//    {
//        NSLog(@"9999");
//    }
//}

//collectionView进行重新布局时调用的方法
//- (nonnull UICollectionViewTransitionLayout *)collectionView:(UICollectionView *)collectionView transitionLayoutForOldLayout:(UICollectionViewLayout *)fromLayout newLayout:(UICollectionViewLayout *)toLayout
//{
//
//}







#pragma mark UICollectionViewDelegateFlowLayout
//动态设置每个Item的尺寸大小

//- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
//{
//
//}



//动态设置每个分区的EdgeInsets

//- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout insetForSectionAtIndex:(NSInteger)section
//{
//    
//}



//动态设置每行的间距大小

//- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section
//{
//
//}



//动态设置每列的间距大小

//- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section
//{
//    
//}



//动态设置某个分区头视图大小

//- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForHeaderInSection:(NSInteger)section
//{
//
//}



//动态设置某个分区尾视图大小

//- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout*)collectionViewLayout referenceSizeForFooterInSection:(NSInteger)section
//{
//    
//}
@end
